const sqlite3 = require('sqlite3').verbose();
const path = require('path');

/**
 * 数据库操作工具类
 * 提供SQLite数据库的初始化和基础操作方法
 */
class Database {
    constructor() {
        this.dbPath = path.join(__dirname, '..', 'database.db');
        this.db = null;
    }

    /**
     * 初始化数据库连接
     * @returns {Promise<void>}
     */
    async init() {
        return new Promise((resolve, reject) => {
            this.db = new sqlite3.Database(this.dbPath, (err) => {
                if (err) {
                    console.error('数据库连接失败:', err.message);
                    reject(err);
                } else {
                    console.log('数据库连接成功');
                    this.createTables().then(resolve).catch(reject);
                }
            });
        });
    }

    /**
     * 创建数据库表
     * @returns {Promise<void>}
     */
    async createTables() {
        const tables = [
            // 区域表
            `CREATE TABLE IF NOT EXISTS areas (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                name TEXT NOT NULL UNIQUE,
                description TEXT,
                created_at DATETIME DEFAULT CURRENT_TIMESTAMP
            )`,
            // 维修项目表
            `CREATE TABLE IF NOT EXISTS repair_items (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                area_id INTEGER,
                name TEXT NOT NULL,
                specification TEXT,
                unit TEXT,
                price REAL NOT NULL,
                remarks TEXT,
                created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
                FOREIGN KEY (area_id) REFERENCES areas(id)
            )`,
            // 计价单表
            `CREATE TABLE IF NOT EXISTS quotations (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                area_id INTEGER,
                location TEXT NOT NULL,
                person TEXT NOT NULL,
                repair_date TEXT NOT NULL,
                items TEXT NOT NULL,
                total_price REAL NOT NULL,
                created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
                FOREIGN KEY (area_id) REFERENCES areas(id)
            )`
        ];

        for (const sql of tables) {
            await this.run(sql);
        }
        console.log('数据库表创建完成');
    }

    /**
     * 执行SQL语句
     * @param {string} sql SQL语句
     * @param {Array} params 参数
     * @returns {Promise<Object>}
     */
    run(sql, params = []) {
        return new Promise((resolve, reject) => {
            this.db.run(sql, params, function(err) {
                if (err) {
                    console.error('SQL执行错误:', err.message);
                    reject(err);
                } else {
                    resolve({ id: this.lastID, changes: this.changes });
                }
            });
        });
    }

    /**
     * 查询单条记录
     * @param {string} sql SQL语句
     * @param {Array} params 参数
     * @returns {Promise<Object>}
     */
    get(sql, params = []) {
        return new Promise((resolve, reject) => {
            this.db.get(sql, params, (err, row) => {
                if (err) {
                    console.error('查询错误:', err.message);
                    reject(err);
                } else {
                    resolve(row);
                }
            });
        });
    }

    /**
     * 查询多条记录
     * @param {string} sql SQL语句
     * @param {Array} params 参数
     * @returns {Promise<Array>}
     */
    all(sql, params = []) {
        return new Promise((resolve, reject) => {
            this.db.all(sql, params, (err, rows) => {
                if (err) {
                    console.error('查询错误:', err.message);
                    reject(err);
                } else {
                    resolve(rows);
                }
            });
        });
    }

    /**
     * 关闭数据库连接
     */
    close() {
        if (this.db) {
            this.db.close((err) => {
                if (err) {
                    console.error('关闭数据库错误:', err.message);
                } else {
                    console.log('数据库连接已关闭');
                }
            });
        }
    }
}

module.exports = new Database();